package com.practice.springboot.rabbitmqtest.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.rabbit.connection.CachingConnectionFactory;
import org.springframework.amqp.rabbit.connection.ConnectionFactory;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;

/**
 * @Description : 直接模式交换机 RabbitMQ配置
 * @Version : V1.0.0
 * @Date : 2021/11/9 17:14
 */
@Configuration
public class DirectRabbitConfig {
    /**
     Broker:它提供一种传输服务,它的角色就是维护一条从生产者到消费者的路线，保证数据能按照指定的方式进行传输,
     Exchange：消息交换机,它指定消息按什么规则,路由到哪个队列。
     Queue:消息的载体,每个消息都会被投到一个或多个队列。
     Binding:绑定，它的作用就是把exchange和queue按照路由规则绑定起来.
     Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
     vhost:虚拟主机,一个broker里可以有多个vhost，用作不同用户的权限分离。
     Producer:消息生产者,就是投递消息的程序.
     Consumer:消息消费者,就是接受消息的程序.
     Channel:消息通道,在客户端的每个连接里,可建立多个channel.
     */

    @Value("${spring.rabbitmq.host}")
    private String host;

    @Value("${spring.rabbitmq.port}")
    private int port;

    @Value("${spring.rabbitmq.username}")
    private String username;

    @Value("${spring.rabbitmq.password}")
    private String password;

    @Value("${spring.rabbitmq.virtual-host}")
    private String vHost;

    // 交换机
    public static final String TestDirectExchange = "TestDirectExchange";

    // 消息队列
    public static final String TestDirectQueue1 = "TestDirectQueue1";


    // 消息队列
    public static final String TestDirectQueue2 = "TestDirectQueue2";

    // RoutingKey
    public static final String TestDirectRouting = "TestDirectRouting";

    // 用于在RabbitMq服务器上生成交换机
    @Bean
    public DirectExchange directExchange() {
        return new DirectExchange(TestDirectExchange, true, false);
    }

    // 用于在RabbitMq服务器上生成消息队列
    @Bean
    public Queue testDirectQueue1() {
        // durable:是否持久化,默认是false; 持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在; 暂存队列：当前连接有效。
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:默认false，是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
        // 一般设置一下队列的持久化就好,其余两个就是默认false
        return new Queue(TestDirectQueue1, true);
    }

    // 用于在RabbitMq服务器上生成消息队列
    @Bean
    public Queue testDirectQueue2() {
        // durable:是否持久化,默认是false; 持久化队列：会被存储在磁盘上，当消息代理重启时仍然存在; 暂存队列：当前连接有效。
        // exclusive:默认也是false，只能被当前创建的连接使用，而且当连接关闭后队列即被删除。此参考优先级高于durable
        // autoDelete:默认false，是否自动删除，当没有生产者或者消费者使用此队列，该队列会自动删除。
        // 一般设置一下队列的持久化就好,其余两个就是默认false
        return new Queue(TestDirectQueue2, true);
    }

    /**
     * 将队列和交换机绑定，并设置路由key
     * @return bind实例
     */
    @Bean
    public Binding binding1() {
        return BindingBuilder.bind(testDirectQueue1()).to(directExchange()).with(TestDirectRouting);
    }

    @Bean
    public Binding binding2() {
        return BindingBuilder.bind(testDirectQueue2()).to(directExchange()).with(TestDirectRouting);
    }
}
